package cn.showw.uitl;

import java.io.*;

import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class Aix {
	
	private static HttpURLConnection conn;
	
	private static Aix aix;
	
	private static String charset = "UTF-8";
	private static String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36";
	
	private static int readTime = 3000;
	private static int connectTime = 15000;
	
	private static boolean followRedirects = true;

	static {
		aix = new Aix();
	}
	
	public static int getResultCode() throws AixException, IOException {
		if (isConn()) {
			throw new AixException("url没有初始化");
		} else {
			return aix.conn.getResponseCode();
		}
	}
	
	public static InputStream getInput() throws AixException, IOException {
		if (isConn()) {
			throw new AixException("url没有初始化");
		} else {
			return aix.conn.getInputStream();
		}
	}
	
	public static byte[] toByteArray() throws AixException, IOException {
		if (isConn()) {
			throw new AixException("url没有初始化");
		} else {
			int len = -1;
			byte[] b = new byte[1024 * 4];
			ByteArrayOutputStream bout = new ByteArrayOutputStream();
			while ((len = aix.conn.getInputStream().read(b)) != -1)
				bout.write(b, 0, len);
			return bout.toByteArray();
		}
	}
	
	public static String getText() throws IOException, AixException {
		return new String(toByteArray());
	}
	
	public static Aix setReadTime(int readTime) {
		aix.readTime = readTime;
		return aix;
	}
	
	public static Aix setUserAgemt(String userAgent) {
		aix.userAgent = userAgent;
		return aix;
	}
	
	public static Aix setConnectTime(int connectTime) {
		aix.connectTime = connectTime;
		return aix;
	}

	public static Aix setFollowRedirects(boolean followRedirects) {
		aix.followRedirects = followRedirects;
		return aix;
	}
	
	private static boolean isConn() {
		return aix.conn == null;
	}
	
	public static Aix setCharset(String charset) {
		aix.charset = charset;
		return aix;
	}
	
	public static String encode(String str) {
		return URLEncoder.encode(str);
	}
	
	public static Aix link(String link) throws IOException {
		aix.conn = (HttpURLConnection) new URL(link).openConnection();
		return aix;
	}
	
	public static Aix referer(String referer) throws AixException {
		if (isConn()) {
			throw new AixException("url没有初始化");
		} else {
			aix.conn.setRequestProperty("Referer", referer);
			return aix;
		}
	}
	
	public static Aix addHeader(String key, String value) throws AixException {
		if (isConn()) {
			throw new AixException("url没有初始化");
		} else {
			aix.conn.setRequestProperty(key, value);
			return aix;
		}
	}
	
	public static Aix setCookie(AixCookie aixCookie) throws AixException {
		if (isConn()) {
			throw new AixException("url没有初始化");
		} else {
			addHeader("Cookie", aixCookie.toCookie());
			return aix;
		}
	}
	
	public static Aix get() throws AixException, IOException {
		if (isConn()) {
			throw new AixException("url没有初始化");
		} else {
			aix.conn.setReadTimeout(aix.readTime);
			aix.conn.setConnectTimeout(aix.connectTime);
			aix.conn.setInstanceFollowRedirects(aix.followRedirects);
			aix.addHeader("Accept-Charset", aix.charset);
			aix.addHeader("User-Agent", aix.userAgent);
			aix.conn.connect();
			return aix;
		}
	}
	
	public static Aix setUseCaches(boolean useCaches) {
		aix.conn.setUseCaches(useCaches);
		return aix;
	}
	
	public static Aix post(String data) throws AixException, IOException {
		if (isConn()) {
			throw new AixException("url没有初始化");
		} else {
			aix.conn.setReadTimeout(aix.readTime);
			aix.conn.setConnectTimeout(aix.connectTime);
			aix.conn.setInstanceFollowRedirects(aix.followRedirects);
			aix.addHeader("Accept-Charset", aix.charset);
			aix.addHeader("User-Agent", aix.userAgent);
			aix.conn.setDoInput(true);
			aix.conn.setDoOutput(true);
			DataOutputStream dos = new DataOutputStream(aix.conn.getOutputStream());
			dos.writeBytes(data);
			dos.flush();
			dos.close();
			return aix;
		}
	}
	
}
